/**
*   ��˵��
*  
*   @Description    
*   @creator         tangkun
*   @create-time     2011-5-26
*   @revision        $Id
*/

package com.scrawler.tool;

import java.util.BitSet;

public class SimpleBloomFilter{

	/**
	 * @param args
	 */
	private static final  int  DEFAULT_SIZE  = 1 << 24 ;
    private static final  int [] seeds = new  int []{5,7,11,13,31,37,61};
    private  BitSet bits = new BitSet(DEFAULT_SIZE);
    private  SimpleHash[] func = new SimpleHash[seeds.length];
    
    public  SimpleBloomFilter() {
        for( int  i= 0 ; i< seeds.length; i ++ ) {
           func[i] = new  SimpleHash(DEFAULT_SIZE, seeds[i]);
       }
   }
    
    public synchronized void add(String value) {
        for(SimpleHash f : func) {
           bits.set(f.hash(value),true);
       }
   }
    
    public synchronized boolean contains(String value) {
        if(value == null ) {
            return false ;
       }
        boolean  ret  = true ;
        for(SimpleHash f : func){
           ret=ret && bits.get(f.hash(value));
           if(!ret)break;
       }
        return  ret;
   }
    
   public boolean clear()
   {
	   bits.clear();
	  return true; 
   }

    
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.print(DEFAULT_SIZE);
		
		SimpleBloomFilter filter = new SimpleBloomFilter();
		String value = "tangkund3218@126.com";
		//System.out.println(filter.contains(value));
		filter.add(value);
		//System.out.println(filter.contains(value));
		value = "http://news.ifeng.com/photo/hdnews/detail_2011_05/26/6652621_0.shtml";
		System.out.println(filter.contains(value));
		if(!filter.contains(value))
		{
			filter.add(value);
		}
		System.out.println(filter.contains(value));
	}
	
	public static class SimpleHash {
        private int  cap;
        private int  seed;
        public  SimpleHash( int cap, int seed) {
            this.cap= cap;
            this.seed =seed;
       }
        public int hash(String value) {
            int  result=0 ;
            int  len= value.length();
            for  (int i= 0 ; i< len; i ++ ) {
               result =seed* result + value.charAt(i);
           }
            return (cap-1) & result;
       }
   }
}
